function foo() {
  console.log(this);
}
foo(); //默认绑定


const obj = {
  name: 'obj',
  foo() {
    console.log(this.name);
  }
};
obj.foo(); //隐式绑定


const obj2 = {
  name: 'obj',
  foo() {
    setTimeout(function () {
      console.log(this.name);
    }, 0);
  }
};
obj2.foo(); //隐式丢失,由于foo()里面的是异步回调函数,当执行setTimeout时,foo()已经执行完毕,obj2的执行上下文已经被销毁了,所以this指向window



const obj3 = {
  name: 'obj3',
  foo: () => {
    console.log(this.name); //箭头函数没有自己的this,所以this指向外层作用域,由于字面量定义没有作用域,因此this指向module.exports(避免全局污染)
  }
};

module.exports.name="module.exports.name"
obj3.foo();



function Foo() {
  this.name = 'Foo';
  this.foo = () => {
    console.log(this.name);
  };
}
const f = new Foo();
f.foo();          
const bar = f.foo;
bar();        



const obj4 = {
  name: 'obj4',
  foo() {
    // 箭头函数在定义时绑定的是：foo方法执行时的this
    // 不是固定绑定obj4！
    const bar=()=>{
      console.log(this.name)
    }
    bar()
  }
}
obj4.foo.call(obj3); //